# Пример проекта, использующего LLVM, TableGen и lit тестирование

## Использование LLVM
Исходный код - в файле `src.cpp`. Построение (включает также построение MLIR):

```
$ mkdir build
$ cmake -B build -DLLVM_DIR=<DIR>/build/lib/cmake/llvm -DMLIR_DIR=<DIR>/build/lib/cmake/mlir
$ cmake --build build --target myllvmtool
$ cmake --build build --target llvm-tblgen
```

Где `<DIR>` - это директория LLVM репозитория, построенная в `<DIR>/build`:
```
$ git clone https://github.com/llvm/llvm-project.git && cd llvm-project && mkdir build
$ cmake -S llvm -B build -DCMAKE_BUILD_TYPE=Debug \
  -DLLVM_TARGETS_TO_BUILD=host                                    \
  -DLLVM_ENABLE_PROJECTS=“clang;mlir“
$ cmake --build build -j `nproc`
$ cmake --build build --target FileCheck
```

### Использование инфраструктуры оптимизаций
Данный репо содержит пример преобразования, выполненного ввиде LLVMIR Pass.
Исходный код - в файлах `include/SwapBinopArgsPass.h` и `lib/SwapBinopArgsPass.cpp`. Для использования
с `opt`, реализовано построение оптимизационного плагина:
```
$ cmake --build build --target toy-plugin
```
Тест, его загружающий и использующий - `test/e2e/swap-binop-args-pass.ll`.

## Использование LIT для тестирования
Сам тест - `test/e2e/check_output_llvmir.test`. Запуск:

```
$ cmake --build build --target test-llvm
```

## Использование TableGen
Тесты - `test/tablegen`. Эти тесты используют бэкэнд по умолчанию, который просто печатает внутреннее представление TableGen.
Запуск:
```
$ cmake --build build --target test-tablegen
```
